package com.content.management.common;

/**
 * @author xinghu
 * @version 1.0
 * @date 2020/4/4 7:03 下午
 */
public class WrapMapper {
	/**
	 * Instantiates a new wrap mapper.
	 */
	// private WrapMapper() {
	// }

	/**
	 * Wrap.
	 *
	 * @param <E>
	 *            the element type
	 * @param code
	 *            the code
	 * @param message
	 *            the message
	 * @param o
	 *            the o
	 * @return the wrapper
	 */
	public static <E> Wrapper<E> wrap(int code, String message, E o) {
		return new Wrapper<E>(code, message, o);
	}

	/**
	 * Wrap.
	 *
	 * @param <E>
	 *            the element type
	 * @param code
	 *            the code
	 * @param message
	 *            the message
	 * @return the wrapper
	 */
	public static <E> Wrapper<E> wrap(int code, String message) {
		return wrap(code, message, null);
	}

	/**
	 * Wrap.
	 *
	 * @param <E>
	 *            the element type
	 * @param code
	 *            the code
	 * @return the wrapper
	 */
	public static <E> Wrapper<E> wrap(int code) {
		return wrap(code, null);
	}

	/**
	 * Wrap.
	 *
	 * @param <E>
	 *            the element type
	 * @param e
	 *            the e
	 * @return the wrapper
	 */
	public static <E> Wrapper<E> wrap(Exception e) {
		return new Wrapper<E>(Wrapper.ERROR_CODE, e.getMessage());
	}

	/**
	 * Un wrapper.
	 *
	 * @param <E>
	 *            the element type
	 * @param wrapper
	 *            the wrapper
	 * @return the e
	 */
	public static <E> E unWrap(Wrapper<E> wrapper) {
		return wrapper.getResult();
	}

	/**
	 * Wrap ILLEGAL_ARGUMENT. code=100
	 *
	 * @param <E>
	 *            the element type
	 * @return the wrapper
	 */
	public static <E> Wrapper<E> illegalArgument() {
		return wrap(Wrapper.ILLEGAL_ARGUMENT_CODE, Wrapper.ILLEGAL_ARGUMENT_MESSAGE);
	}

	/**
	 * Wrap TIME_OUT. code=110
	 *
	 * @param <E>
	 *            the element type
	 * @return the wrapper
	 */
	public static <E> Wrapper<E> timeOut() {
		return wrap(Wrapper.TIME_OUT_CODE, Wrapper.TIME_OUT_MESSAGE);
	}

	/**
	 * Wrap SECURE_FAIL. code=120
	 *
	 * @param <E>
	 *            the element type
	 * @return the wrapper
	 */
	public static <E> Wrapper<E> secureFail() {
		return wrap(Wrapper.SECURE_FAIL_CODE, Wrapper.SECURE_FAIL_MESSAGE);
	}

	/**
	 * Wrap SUCCESS. code=200
	 *
	 * @param <E>
	 *            the element type
	 * @return the wrapper
	 */
	public static <E> Wrapper<E> ok() {
		return new Wrapper<E>();
	}

	/**
	 * Wrap ERROR. code=500
	 *
	 * @param <E>
	 *            the element type
	 * @return the wrapper
	 */
	public static <E> Wrapper<E> error() {
		return wrap(Wrapper.ERROR_CODE, Wrapper.ERROR_MESSAGE);
	}
}
